package com.peng.androidlib.appbase;

import android.app.Dialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.Window;
import android.view.WindowManager;

import com.peng.androidlib.R;
import com.peng.androidlib.appmanager.ActivityManager;
import com.peng.androidlib.appstyle.StatusBarCompat;
import com.peng.androidlib.appwidget.LoadingDialog;
import com.peng.androidlib.mvpbase.BaseModel;
import com.peng.androidlib.mvpbase.BasePresenter;
import com.peng.androidlib.utils.LogUtils;
import com.peng.androidlib.utils.ToastWithImageUtils;

import butterknife.ButterKnife;
import butterknife.Unbinder;

/**
 * 使用举例
 */
//1.mvp模式
//public class SampleActivity extends BaseActivity<NewsChanelPresenter, NewsChannelModel> implements NewsChannelContract.View {
//    @Override
//    public int getLayoutId() {
//        return R.layout.activity_news_channel;
//    }
//
//    @Override
//    public void initPresenter() {
//        mPresenter.setVM(this, mModel);
//    }
//
//    @Override
//    public void initView() {
//    }
//}

//2.普通模式
//public class SampleActivity extends BaseActivity {
//    @Override
//    public int getLayoutId() {
//        return R.layout.activity_news_channel;
//    }
//
//    @Override
//    public void initPresenter() {
//    }
//
//    @Override
//    public void initView() {
//    }
//}

/**
 * Created by Mr.Q on 2018/10/8.
 * 描述：
 * 1、基类 Activity，封装一些业务无关的公共逻辑
 * 2、统一事件编程模型，即均以 setOnClickListener 的方式设置点击事件，遵循面向对象原则
 * 3、尽量不要使用全局变量，App 一旦被切换到后台，当手机内存不足时，就会回收全局变量，在切换回前台就会因为全局变量为null而崩溃
 * 4、页面之前传递实体类，实体类需要序列化
 * 5、页面跳转，取消当前页面的所有网络请求，以防止产生积压
 */
public abstract class BaseActivity<P extends BasePresenter, M extends BaseModel> extends AppCompatActivity {

    public P mPresenter;
    public M mModel;
    public BaseActivity mContext;
    private Dialog mDialog;
    Unbinder unbinder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        doBeforeSetContentView();

        // 处理 Extra 数据
        Bundle extras = getIntent().getExtras();
        if (null != extras) {
            handleBundleExtras(extras);
        }
        if (null != savedInstanceState) {
            handleSavedInstanceState(savedInstanceState);
        }

        setContentView(getLayoutId());

        unbinder = ButterKnife.bind(this);

        mContext = this;

        this.initPresenter();
        if (mPresenter != null) {
            mPresenter.mContext = this;
        }

        // 初始化控件
        initViews();

        // 加载网络、本地、缓存等数据
        loadData();

    }

    protected abstract void loadData();

    protected abstract void initViews();

    /**
     * 子类实现,获取布局文件
     *
     * @return
     */
    protected abstract int getLayoutId();

    /**
     * 简单页面无需mvp就不用管此方法即可,完美兼容各种实际场景的变通
     */
    protected void initPresenter() {

    }

    protected abstract void handleBundleExtras(@NonNull Bundle extras);

    protected abstract void handleSavedInstanceState(@NonNull Bundle savedInstanceState);

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        LogUtils.logd("savedInstanceState");
    }


    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LogUtils.logd("onConfigurationChanged");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        LogUtils.logd("onRestart");
    }

    @Override
    protected void onStart() {
        super.onStart();
        LogUtils.logd("onStart");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        LogUtils.logd("onSaveInstanceState");
    }

    /**
     * 在 layout 前配置
     * 1、初始化主题
     * 2、Activity 添加到 Activity 管理器，手动管理 Activity 栈
     * 3、设置状态栏的颜色，根据系统版本进行设置
     */
    private void doBeforeSetContentView() {

        //设置昼夜主题
        //initTheme();

        /*
         1、把 activity 放到 application 栈中管理，手动管理 Activity 栈
         2、也可以用 ActivityUtils 获取 Activity 栈状态
        */
        ActivityManager.getAppManager().addActivity(this);

        // 无标题
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // 默认着色状态栏
        SetStatusBarColor();

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    /**
     * 设置主题
     */
//    private void initTheme() {
//        ThemeController.setTheme(this, R.style.DayTheme, R.style.NightTheme);
//    }

    /**
     * 着色状态栏（4.4以上系统有效）
     */
    protected void SetStatusBarColor() {
        StatusBarCompat.setStatusBarColor(this, ContextCompat.getColor(this, R.color.main_color));
    }

    /**
     * 着色状态栏（4.4以上系统有效）
     */
    protected void SetStatusBarColor(int color) {
        StatusBarCompat.setStatusBarColor(this, color);
    }

    /**
     * 沉浸状态栏（4.4以上系统有效），全屏模式
     */
    protected void SetTranslanteBar() {
        StatusBarCompat.translucentStatusBar(this);
    }


    @Override
    public void startActivity(Intent intent) {
        super.startActivity(intent);
    }

    /**
     * 通过 Class 跳转界面，不含参数
     **/
    public void startActivity(Class<?> cls) {
        startActivity(cls, null);

    }

    /**
     * 含有 Bundle 通过 Class 跳转界面
     * 带有跳转动画
     **/
    public void startActivity(Class<?> cls, Bundle bundle) {
        Intent intent = new Intent();
        intent.setClass(this, cls);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivity(intent);
        overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);
    }

    /**
     * 通过 Class 跳转界面
     **/
    public void startActivityForResult(Class<?> cls, int requestCode) {
        startActivityForResult(cls, null, requestCode);
        overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);
    }

    /**
     * 含有Bundle通过Class跳转界面
     **/
    public void startActivityForResult(Class<?> cls, Bundle bundle,
                                       int requestCode) {
        Intent intent = new Intent();
        intent.setClass(this, cls);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivityForResult(intent, requestCode);
        overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);
    }

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
    }

    /**
     * finish 当前界面，手动控制页面关闭动画
     *
     * @param closeAnim true：关闭时有动画，false：关闭是无动画
     */
    public void finish(boolean closeAnim) {
        super.finish();
        if (closeAnim) {
            overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
        }
    }


    /**
     * 开启浮动加载进度条
     */
    public void startProgressDialog() {
        mDialog = LoadingDialog.showDialogForLoading(this);
    }

    /**
     * 开启浮动加载进度条
     *
     * @param msg
     */
    public void startProgressDialog(String msg) {
        mDialog = LoadingDialog.showDialogForLoading(this, msg, true);
    }

    /**
     * 停止浮动加载进度条
     */
    public void stopProgressDialog() {
        if (mDialog != null) {
            mDialog.cancel();
        }
    }

    /**
     * 带图片的 Toast
     *
     * @param text
     * @param res
     */
    public void showToastWithImg(String text, int res) {
        ToastWithImageUtils.showToastWithImg(text, res);
    }

    /**
     * 带图片的toast
     *
     * @param text
     * @param res
     */
    public void showToastWithImgShort(String text, int res) {
        ToastWithImageUtils.showToastWithImgShort(text, res);
    }

    /**
     * 网络访问错误提醒
     */
    public void showNetErrorTip() {
        ToastWithImageUtils.showToastWithImg(getText(R.string.net_error).toString(), R.mipmap.msg_icon_fail);
    }

    public void showNoNetTip() {
        ToastWithImageUtils.showToastWithImg(getText(R.string.no_net).toString(), R.mipmap.msg_icon_fail);
    }

    public void showNetErrorTip(String error) {
        ToastWithImageUtils.showToastWithImg(error, R.mipmap.msg_icon_fail);
    }

    @Override
    protected void onResume() {
        LogUtils.logd("onResume");
        super.onResume();
    }

    @Override
    protected void onPause() {
        LogUtils.logd("onPause");
        super.onPause();
    }


    @Override
    protected void onDestroy() {
        LogUtils.logd("onDestroy");
        ActivityManager.getAppManager().removeActivity(this);
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.onDestroy();
        }
        unbinder.unbind();
    }

    /**
     * 使用 replace 方法设置 Fragment
     *
     * @param containerViewId
     * @param fragment
     */
    protected void setFragmentOfReplace(@NonNull int containerViewId, BaseFragment fragment) {
        setFragmentOfReplace(containerViewId, fragment, null);
    }

    /**
     * 使用 replace 方法设置 Fragment
     *
     * @param containerViewId
     * @param fragment
     */
    protected void setFragmentOfReplace(@NonNull int containerViewId, BaseFragment fragment, Bundle bundle) {
        if (bundle != null) {
            fragment.setArguments(bundle);
        }
        getSupportFragmentManager()
                .beginTransaction()
                .replace(containerViewId, fragment)
                .commit();
    }

    /**
     * 使用 add 方法添加 Fragment
     *
     * @param containerViewId
     * @param fragment
     * @param tag
     */
    protected void setFragmentOfAdd(@NonNull int containerViewId, BaseFragment fragment, String tag) {
        setFragmentOfAdd(containerViewId, fragment, null, tag, false);
    }

    /**
     * 为 Activity 中的容器设置 Fragment
     *
     * @param containerViewId
     * @param fragment
     * @param bundle
     * @param tag
     */
    protected void setFragmentOfAdd(@NonNull int containerViewId, BaseFragment fragment, Bundle bundle, String tag) {
        setFragmentOfAdd(containerViewId, fragment, bundle, tag, false);
    }

    /**
     * 为 Activity 中的容器设置 Fragment
     *
     * @param containerViewId
     * @param fragment
     * @param bundle
     * @param tag
     */
    protected void setFragmentOfAdd(@NonNull int containerViewId, BaseFragment fragment, Bundle bundle, String tag, boolean showAnim) {
        FragmentManager mFragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = mFragmentManager.beginTransaction();
        transaction.addToBackStack(null);
        if (showAnim) {
            //注意setCustomAnimations()方法必须在 add、remove、replace 调用之前被设置，否则不起作用。
            transaction.setCustomAnimations(R.animator.fragment_slide_right_enter, R.animator.fragment_slide_right_exit, R.animator.fragment_slide_right_enter, R.animator.fragment_slide_right_exit);
        }
        if (bundle != null) {
            fragment.setArguments(bundle);
        }
        transaction.add(containerViewId, fragment, tag);
        transaction.commit();
    }
}

